www.gusucode.com > VC++ 小型会员积分管理系统-源码程序 > VC++ 小型会员积分管理系统-源码程序/code/AcPtsRecorder/listctrlex/ListCtrlEx.cpp

    //Download by http://www.NewXing.com
// ListCtrlEx.cpp : implementation file
//

#include "stdafx.h"
#include "ListCtrlEx.h"
#include ".\listctrlex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx

CListCtrlEx::CListCtrlEx()
{
	m_nSortedCol = 0;
	m_bAscending = FALSE;
}

CListCtrlEx::~CListCtrlEx()
{
}


BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
	//{{AFX_MSG_MAP(CListCtrlEx)
	//}}AFX_MSG_MAP
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx message handlers


void CListCtrlEx::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	EnableToolTips(TRUE);

	if(GetHeaderCtrl())
		m_SkinHeaderCtrl.SubclassWindow(GetHeaderCtrl()->m_hWnd);
	
	DWORD dwStyle = GetStyle();
	ModifyStyleEx(0, WS_EX_CLIENTEDGE);
	dwStyle = GetStyle();
	dwStyle = GetExtendedStyle();
	SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_TRACKSELECT);
	dwStyle = GetExtendedStyle();
	
	SetBkColor(RGB(188,194,212));
	SetTextBkColor(RGB(188,194,212));

	CListCtrl::PreSubclassWindow();
}

INT_PTR CListCtrlEx::OnToolHitTest(CPoint point, TOOLINFO * pTI) const
{
	int row, col;
	RECT cellrect;
	row = CellRectFromPoint(point, &cellrect, &col );

	if ( row == -1 ) 
		return -1;

	pTI->hwnd = m_hWnd;
	pTI->uId = (UINT)((row<<10)+(col&0x3ff)+1);
	pTI->lpszText = LPSTR_TEXTCALLBACK;
	pTI->rect = cellrect;

	return pTI->uId;
}

int CListCtrlEx::CellRectFromPoint(CPoint &point, RECT *cellrect, int *col) const
{
	int colnum;

	// Make sure that the ListView is in LVS_REPORT
	if( (GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK) != LVS_REPORT )
		return -1;

	// Get the top and bottom row visible
	int row = GetTopIndex();
	int bottom = row + GetCountPerPage();
	if( bottom > GetItemCount() )
		bottom = GetItemCount();
	
	// Get the number of columns
	CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
	int nColumnCount = pHeader->GetItemCount();

	// Loop through the visible rows
	for( ;row <=bottom;row++)
	{
		// Get bounding rect of item and check whether point falls in it.
		CRect rect;
		GetItemRect( row, &rect, LVIR_BOUNDS );
		if( rect.PtInRect(point) )
		{
			// Now find the column
			for( colnum = 0; colnum < nColumnCount; colnum++ )
			{
				int colwidth = GetColumnWidth(colnum);
				if( point.x >= rect.left 
					&& point.x <= (rect.left + colwidth ) )
				{
					RECT rectClient;
					GetClientRect( &rectClient );
					if( col ) *col = colnum;
					rect.right = rect.left + colwidth;

					// Make sure that the right extent does not exceed
					// the client area
					if( rect.right > rectClient.right ) 
						rect.right = rectClient.right;
					*cellrect = rect;
					return row;
				}
				rect.left += colwidth;
			}
		}
	}
	
	return -1;
}

BOOL CListCtrlEx::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
	// need to handle both ANSI and UNICODE versions of the message
	TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
	TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
	CString strTipText;
	UINT_PTR nID = pNMHDR->idFrom;

	if( nID == 0 )	  	// Notification in NT from automatically
		return FALSE;   	// created tooltip

	int row = (int)(((nID-1) >> 10) & 0x3fffff );
	int col = (int)((nID-1) & 0x3ff);
	strTipText = GetItemText( row, col );

#ifndef _UNICODE
	if (pNMHDR->code == TTN_NEEDTEXTA)
		lstrcpyn(pTTTA->szText, strTipText, 80);
	else
		_mbstowcsz(pTTTW->szText, strTipText, 80);
#else
	if (pNMHDR->code == TTN_NEEDTEXTA)
		_wcstombsz(pTTTA->szText, strTipText, 80);
	else
		lstrcpyn(pTTTW->szText, strTipText, 80);
#endif
	*pResult = 0;

	return TRUE;    // message was handled
}

int CALLBACK CListCtrlEx::CallbackCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParam3)
{
	CListCtrlEx* pSortedList = (CListCtrlEx *)(lParam3);
	CString str1,str2;	

	LVFINDINFO info;
	int nIndex;

	info.flags = LVFI_PARAM;

	info.lParam = lParam1;	
	nIndex = pSortedList->FindItem(&info);	
	if(-1 != nIndex)
		str1 = pSortedList->GetItemText(nIndex,pSortedList->m_nSortedCol);

	info.lParam = lParam2;	
	nIndex = pSortedList->FindItem(&info);	
	if(-1 != nIndex)
		str2 = pSortedList->GetItemText(nIndex,pSortedList->m_nSortedCol);

	return pSortedList->CompareItems (str1, str2);
}

int CListCtrlEx::CompareItems(CString& str1, CString& str2)
{
	return m_bAscending == (str1>=str2);
}

BOOL CListCtrlEx::SortList(int nCol, bool bAscending)
{
	m_bAscending = bAscending;
	m_nSortedCol = nCol;
	return 	SortItems(CallbackCompareItems,(DWORD_PTR)this);
}

bool  CListCtrlEx::GetAscending()
{
	m_bAscending = !m_bAscending;
	return m_bAscending;
}

BOOL CListCtrlEx::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
	// TODO: 在此添加专用代码和/或调用基类
	
	BOOL bResult =  CListCtrl::Create(dwStyle, rect, pParentWnd, nID);

	if(GetHeaderCtrl())
		m_SkinHeaderCtrl.SubclassWindow(GetHeaderCtrl()->m_hWnd);

	SetBkColor(RGB(188,194,212));
	SetTextBkColor(RGB(188,194,212));

	return bResult;
}